#pragma once

#include <iostream>
#include <osg/Group>
#include <QObject>
/**
 * @brief 三维场景Model，负责存储三维数据，并和View进行交互
 */
class xSceneModel : public QObject
{
    Q_OBJECT
public:
    xSceneModel(QObject *parent = NULL);
    virtual ~xSceneModel();

    /**
     * @brief getRootNode  获得根节点
     */
    osg::Group* getRootNode() const;

    /**
     * @brief saveSceneData  保存场景
     * @param 导出路径
     */
    bool saveSceneData(const std::string &);

signals:
    /**
     * @brief sigUpdateModel  更新场景
     */
    void sigUpdateModel();

protected:
    /**
     * @brief createScene  创建场景
     */
    void createScene();

    /**
     * @brief initialViewerGroup  初始化viewerGroup
     */
    void initialViewerGroup();

    /**
     * @brief createSceneStruct  创建场景节点结构
     */
    void createSceneStruct();

    /**
     * @brief initSceneNode  初始化场景节点
     */
    void initSceneNode();

private:
    /**
     * @brief mRoot  根节点
     */
    osg::ref_ptr<osg::Group> mRoot;

    /**
     * @brief mModel  当前模型
     */
    osg::ref_ptr<osg::Node> mModel;

    /**
     * @brief mSceneGroup  保存场景数据节点组
     */
    osg::ref_ptr<osg::Group> mSceneGroup;

    /**
     * @brief mEditSceneGroup  保存场景编辑组
     */
    osg::ref_ptr<osg::Group> mEditSceneGroup;

    /**
     * @brief mViewerGroup  保存鼠标坐标
     */
    osg::ref_ptr<osg::Group> mViewerGroup;

    /**
     * @brief mMapperGroup  保存测图结果
     */
    osg::ref_ptr<osg::Group> mMapperGroup;

    /**
     * @brief mSkyBoxGroup  保存天空盒节点
     */
    osg::ref_ptr<osg::Group> mSkyBoxGroup;

    /**
     * @brief mTempGroup mTempGroup1 mScopeGroup 临时组
     */
    osg::ref_ptr<osg::Group> mTempGroup, mTempGroup1, mScopeGroup;
};

